﻿/*************************************
 * Creator:SW-PeiYang
 * DateTime:2023/2/20 14:02:39
 * Description:<Description>
 * CopyRight:中广核研究院有限公司
 * ***********************************/

using Cpjit.SunnyPaine.Toolkit.Net.Sockets.Model;
using System;
using System.Net;
using System.Net.Sockets;

namespace Cpjit.SunnyPaine.Toolkit.Net.Sockets.TCP
{
    /// <summary>
    /// 表示TCP客户端。
    /// </summary>
    public interface ITcpClient : ISocket
    {
        /// <summary>
        /// TCP客户端。
        /// </summary>
        Socket Client { get; }
        /// <summary>
        /// 客户端Id。
        /// </summary>
        string ClientId { get; }
        /// <summary>
        /// 服务端IP。
        /// </summary>
        IPAddress ServerIP { get; }
        /// <summary>
        /// 服务端端口。
        /// </summary>
        int ServerPort { get; }
        /// <summary>
        /// 服务端终结点。
        /// </summary>
        EndPoint ServerEndPoint { get; }
        /// <summary>
        /// 客户端是否已连接服务端。
        /// </summary>
        bool IsConnected { get; }
        /// <summary>
        /// 是否启用心跳。
        /// </summary>
        bool IsUseHeartbeat { get; set; }
        /// <summary>
        /// 心跳周期。
        /// </summary>
        uint HeartbeatInterval { get; set; }
        /// <summary>
        /// 是否启用重连。
        /// </summary>
        bool IsAutoReconnect { get; set; }


        /// <summary>
        /// 当收到消息时发生。
        /// </summary>
        event Action<ITcpClient, SessionEventArgs> OnReceived;
        /// <summary>
        /// 当有客户端连接时发生。
        /// </summary>
        event Action<ITcpClient, SessionEventArgs> OnConnected;
        /// <summary>
        /// 当有客户端断开连接时发生。
        /// </summary>
        event Action<ITcpClient, SessionEventArgs> OnDisConnected;
        /// <summary>
        /// 当出现错误时发生。
        /// </summary>
        event Action<ITcpClient, SessionEventArgs, Exception> OnError;


        /// <summary>
        /// 连接服务端。
        /// </summary>
        /// <returns></returns>
        bool Connect();

        /// <summary>
        /// 异步连接服务端。
        /// </summary>
        void ConnectAsync();

        /// <summary>
        /// 断开与服务端的连接，并释放资源。
        /// </summary>
        void Close();

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="message"></param>
        void Send(string message);

        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="datas"></param>
        void Send(byte[] datas);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="message"></param>
        void SendAsync(string message);

        /// <summary>
        /// 异步发送消息。
        /// </summary>
        /// <param name="datas"></param>
        void SendAsync(byte[] datas);
    }
}
